<?php
/**
 * Класс обеспечивающий занесение зафиксированных и переданных ему ошибок приложения.
 * Позволяет записывать лог ошибок в файл, базу данных или FireBug консоль
 * в зависимости от указанного контектса
 * 
 * TODO требуется доработка
 * 
 * LICENSE: Free to use license
 * 
 * @copyright 	2009
 * @author 		Яковлев Иван Yak1980@list.ru | Best4u.mail@gmail.com
 * @version		$id:$
 * @link 
 * @since 
 */

//require_once ('Zend/Log.php');

class System_Logger
{
  	/**
	 * Статический метод для записи лога (без инстанцирования объекта)
	 * 
	 * @param string $msg
	 * @param string $logto ('file'|'fireBug'|'db'|'email')
	 * @param string $logType ('err'|'error'|'debug'|'warn'|'info'|'alert'|'crit'|'debug'|'emerg'|'notice')
	 * @param string $encode - указывает в какую кодировку надо преобразовать полученное сообщение
	 * @param string $logFileName - имя файла в который будет записан логг (по умолчанию все логи будут
	 * 								записываться в файл data/logs/log.log)
	 */
	public static function log($msg, $logType = 'info', $logto = 'file', $encode = 'utf-8', $logFileName = 'log.log')
	{
		switch ($logto) {
			case 'db':
				// запись лога в базу данных
				self::_logToDb($msg, $logType);
			break;
			
			case 'fireBug':
				// запись лога в консоль FireBug
				self::_logToFireBug($msg, $logType, $encode);
			break;
			
			case 'email':
				// отправка сообщения лога на эл. почту
				self::_logToEmail($msg, $logType);
			break;
			
			default:
				// запись лога в файл (по умолчанию)
				self::_logToFile($msg, $logType, $logFileName);
			break;
		}
		
	}
	
	/**
	 * запись сообщения лога в файл.
	 * Приватный метод (вызывается только из самого класса)
	 * 
	 * @param string $msg - текст сообщения ошибки
	 * @param string $logType - тип лога (err|warn|notice|alert|crit|debug|emerg|info)
	 * @param string $logFileName - имя файла лога (debug.log|errors.log|loginerrors.log|null)
	 */
	private static function _logToFile($msg, $logType, $logFileName)
	{
		switch ($logFileName) {
			case 'debug.log':
				$logger = Zend_Registry::get('debugLogger');
			break;
			
			case 'errors.log':
				$logger = Zend_Registry::get('appErrorsLogger');
			break;
			
			case 'formerrors.log':
				$logger = Zend_Registry::get('formErrorsLogger');
			break;
			
			case 'loginerrors.log':
				$logger = Zend_Registry::get('loginErrorsLogger');
			break;
			
			default:
				$logger = Zend_Registry::get('logLogger');
			break;
		}
		
		switch ($logType) {
        	case 'err':
        		$logger->log($msg, Zend_Log::ERR);
        	break;
        	
        	case 'warn':
        		$logger->log($msg, Zend_Log::WARN);
        	break;
        	
        	case 'notice':
        		$logger->log($msg, Zend_Log::NOTICE);
        	break;
        	
        	case 'alert':
        		$logger->log($msg, Zend_Log::ALERT);
        	break;
        	
        	case 'crit':
        		$logger->log($msg, Zend_Log::CRIT);
        	break;
        	
        	case 'debug':
        		$logger->log($msg, Zend_Log::DEBUG);
        	break;
        	
        	case 'emerg':
        		$logger->log($msg, Zend_Log::EMERG);
        	break;
        	
        	default:
        		$logger->log($msg, Zend_Log::INFO);
        	break;
        }
			
	}
	
	/**
	 * запись сообщения лога в консоль FireBug.
	 * Приватный метод (вызывается только из самого класса)
	 * 
	 * @param string $msg - текст сообщения ошибки
	 * @param string $logType - тип лога
	 * @param string $encode - в какую кодировку перекодировать текст сообщения
	 */
	private static function _logToFireBug($msg, $logType, $encode)
	{
		if ($encode == 'utf-8') $msg = iconv('windows-1251', 'utf-8', $msg);
		$loggerFireBug = Zend_Registry::get('loggerFireBug');
		switch ($logType) {
        	case 'err':
        		$loggerFireBug->log($msg, Zend_Log::ERR);
        	break;
        	
        	case 'warn':
        		$loggerFireBug->log($msg, Zend_Log::WARN);
        	break;
        	
        	case 'notice':
        		$loggerFireBug->log($msg, Zend_Log::NOTICE);
        	break;
        	
        	case 'alert':
        		$loggerFireBug->log($msg, Zend_Log::ALERT);
        	break;
        	
        	case 'crit':
        		$loggerFireBug->log($msg, Zend_Log::CRIT);
        	break;
        	
        	case 'debug':
        		$loggerFireBug->log($msg, Zend_Log::DEBUG);
        	break;
        	
        	case 'emerg':
        		$loggerFireBug->log($msg, Zend_Log::EMERG);
        	break;
        	
        	default:
        		$loggerFireBug->log($msg, Zend_Log::INFO);
        	break;
        }
	}

	/**
	 * запись сообщения лога в базу данных.
	 * Приватный метод (вызывается только из самого класса)
	 * 
	 * @param string $msg - текст сообщения ошибки
	 * @param string $logType - тип лога
	 */
	private static function _logToDb($msg, $logType)
	{
		// TODO
		switch ($logType) {
        	case 'err':
        		// TODO
        	break;
        	
        	case 'warn':
        		// TODO
        	break;
        	
        	case 'notice':
        		// TODO
        	break;
        	
        	case 'alert':
        		// TODO
        	break;
        	
        	case 'crit':
        		// TODO
        	break;
        	
        	case 'debug':
        		// TODO
        	break;
        	
        	case 'emerg':
        		// TODO
        	break;
        	
        	default:
        		// TODO
        	break;
        }
	}
	
	/**
	 * отправка сообщения лога на эл. почту.
	 * Приватный метод (вызывается только из самого класса)
	 * 
	 * @param string $msg - текст сообщения ошибки
	 * @param string $logType - тип лога
	 */
	private static function _logToEmail($msg, $logType)
	{
		// TODO
		switch ($logType) {
        	case 'err':
        		// TODO
        	break;
        	
        	case 'warn':
        		// TODO
        	break;
        	
        	case 'notice':
        		// TODO
        	break;
        	
        	case 'alert':
        		// TODO
        	break;
        	
        	case 'crit':
        		// TODO
        	break;
        	
        	case 'debug':
        		// TODO
        	break;
        	
        	case 'emerg':
        		// TODO
        	break;
        	
        	default:
        		// TODO
        	break;
        }
	}
    
}
